--- /dev/null
+/*
+ Copyright (C) 2004 Justin Broughton, justinbr@earthlink.net
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
+
+ */
+
+#include "defs.h"
+#if !NO_EXPAT
+#include <expat.h>
+static XML_Parser psr;
+#endif
+
+FILE *fd;
+FILE *ofd;
+
+#define MYNAME "coastexp"
+#define MY_CBUF 4096
+
+#if NO_EXPAT
+void
+ce_rd_init(const char *fname)
+{
+ fatal(MYNAME ": This build excluded CoastalExplorer support because expat was not installed.\n");
+}
+
+void
+ce_read(void)
+{
+}
+#else
+
+static char *element; // Current element being parsed
+static char *cdatastr; // Current XML character data being built up (until a <lf>)
+
+/* CE-specific mark structure - used for both route marks and standalone marks */
+struct CE_MARK {
+ struct CE_MARK *next; // pointer to next mark in list
+ char *id; // CE's mark ID (of the form "{<guid>}")
+ waypoint *wp; // GPSBabel waypoint
+ int used; // Is this mark used in a route or not?
+};
+typedef struct CE_MARK ce_mark;
+
+/* CE-specific route structure */
+struct CE_ROUTE {
+ struct CE_ROUTE *next; // pointer to next route in list
+ char *id; // CE's route ID (of the form "{<guid>}")
+ route_head *r; // GPSBabel route header
+ ce_mark *marks; // list of CE marks in this route
+};
+typedef struct CE_ROUTE ce_route;
+
+static ce_route *routes = NULL; // List of routes currently found
+static ce_route *currentRoute = NULL; // Current route being processed
+static ce_mark *marks = NULL; // List of stand-alone marks currently found
+static ce_mark *currentMark = NULL; // Current mark being processed
+static int inRoute = 0; // Are we processing a route?
+static int inMark = 0; // Are we processing a mark?
+
+/* Add a route to the list of routes */
+static void
+add_route(ce_route *route)
+{
+ if (routes == NULL) {
+ routes = route;
+ } else {
+ ce_route *curr = routes;
+ while (curr->next != NULL)
+ curr = curr->next;
+ curr->next = route;
+ }
+}
+
+/* Add a mark to the list of stand-alone marks */
+static void
+add_mark(ce_mark *mark)
+{
+ if (marks == NULL) {
+ marks = mark;
+ } else {
+ ce_mark *curr = marks;
+ while (curr->next != NULL)
+ curr = curr->next;
+ curr->next = mark;
+ }
+}
+
+/* Add a mark to the specified route */
+static void
+add_mark_to_route(ce_route *route, ce_mark *mark)
+{
+ if (route->marks == NULL) {
+ route->marks = mark;
+ } else {
+ ce_mark *curr = route->marks;
+ while (curr->next != NULL)
+ curr = curr->next;
+ curr->next = mark;
+ }
+}
+
+/* Start processing an XML item */
+static void
+ce_start(void *data, const char *el, const char **attr)
+{
+ element = xstrdup(el);
+ if (0 == strcmp(el, "Route")) {
+ inRoute = 1;
+ const char **ap;
+ for (ap = attr; *ap; ap+=2) {
+ if (0 == strcmp(ap[0], "id")) {
+ // Create a CE route object and add it to the list of routes
+ currentRoute = (ce_route *) xcalloc(sizeof (ce_route), 1);
+ currentRoute->next = NULL;
+ currentRoute->id=xstrdup(ap[1]);
+ currentRoute->r = route_head_alloc();
+ currentRoute->marks = NULL;
+ add_route(currentRoute);
+ }
+ }
+ } else if (0 == strcmp(el, "Mark")) {
+ inMark = 1;
+ const char **ap;
+ for (ap = attr; *ap; ap+=2) {
+ if (0 == strcmp(ap[0], "id")) {
+ // Create a CE mark object and add it to the list of stand-alone marks
+ currentMark = (ce_mark *) xcalloc(sizeof (ce_mark), 1);
+ currentMark->next = NULL;
+ currentMark->id=xstrdup(ap[1]);
+ currentMark->wp = NULL;
+ currentMark->used = 0;
+ add_mark(currentMark);
+ }
+ }
+ }
+}
+
+/* Finish processing an XML item */
+static void
+ce_end(void *data, const char *el)
+{
+ if (0 == strcmp(el, "Route"))
+ inRoute = 0;
+ else if (0 == strcmp(el, "Mark"))
+ inMark = 0;
+}
+
+/* Process some XML character data for the current item */
+static void
+ce_cdata(void *dta, const XML_Char *s, int len)
+{
+ if (*s != '\n') {
+ // We buffer up characters in 'cdatastr' until a single <lf> is received
+ if ((strlen(cdatastr) + len) > MY_CBUF) {
+ printf("Buffer overflow - line too long!");
+ exit(-1);
+ }
+ char *edatastr = cdatastr+strlen(cdatastr);
+ memcpy(edatastr, s, len);
+ edatastr[len] = '\0';
+ } else {
+ // Now process what we have in 'cdatastr'
+ s = cdatastr;
+ while (*s != '\0' && (*s == '\b' || *s == '\t'))
+ s++;
+ if (strlen(s) <= 0)
+ return;
+ if (0 == strcmp(element, "Marks")) {
+ if (inRoute == 1) {
+ // We are processing the marks in a route so create a CE mark object
+ // and add it to the current route
+ ce_mark *mark = (ce_mark *) xcalloc(sizeof (ce_mark), 1);
+ mark->next = NULL;
+ mark->id = xstrdup(s);
+ mark->wp = NULL;
+ add_mark_to_route(currentRoute, mark);
+ }
+ } else if (0 == strcmp(element, "Position")) {
+ if (inMark == 1) {
+ // We are processing a standalone mark so read the lat/long position
+ // and create a waypoint to add to the current mark
+ char *position = xstrdup(s);
+ char *lat = position;
+ char *latNorS = position;
+ while (*latNorS != ' ')
+ latNorS++;
+ *latNorS++ = '\0';
+ char *lng = latNorS;
+ lng++; lng++;
+ char *longEorW = lng;
+ while (*longEorW != ' ')
+ longEorW++;
+ *longEorW++ = '\0';
+ currentMark->wp = waypt_new();
+ currentMark->wp->latitude = atof(lat);
+ if (*latNorS == 'S')
+ currentMark->wp->latitude = -currentMark->wp->latitude;
+ currentMark->wp->longitude = atof(lng);
+ if (*longEorW == 'W')
+ currentMark->wp->longitude = -currentMark->wp->longitude;
+ }
+ } else if (0 == strcmp(element, "Name")) {
+ // Names we care about may be either for routes or marks
+ char *name = xstrdup(s);
+ if (inMark == 1)
+ currentMark->wp->shortname = name;
+ else if (inRoute == 1)
+ currentRoute->r->rte_name = name;
+ } else if (0 == strcmp(element, "Description")) {
+ // Descriptions we care about may be either for routes or marks
+ char *desc = xstrdup(s);
+ if (inMark == 1)
+ currentMark->wp->description = desc;
+ else if (inRoute == 1)
+ currentRoute->r->rte_desc = desc;
+ }
+
+ // Start building a new string since we are done with this one
+ cdatastr[0] = '\0';
+ }
+}
+
+/* Set up reading the CE input file */
+void
+ce_rd_init(const char *fname)
+{
+ fd = xfopen(fname, "r", MYNAME);
+
+ psr = XML_ParserCreate(NULL);
+ if (!psr) {
+ fatal(MYNAME ":Cannot create XML parser\n");
+ }
+
+ XML_SetElementHandler(psr, ce_start, ce_end);
+ cdatastr = xcalloc(MY_CBUF,1);
+ XML_SetCharacterDataHandler(psr, ce_cdata);
+}
+
+/* Parse the input file */
+void
+ce_read(void)
+{
+ int len;
+ char buf[MY_CBUF];
+
+ while ((len = fread(buf, 1, sizeof(buf), fd))) {
+ if (!XML_Parse(psr, buf, len, feof(fd))) {
+ fatal(MYNAME ":Parse error at %d: %s\n",
+ XML_GetCurrentLineNumber(psr),
+ XML_ErrorString(XML_GetErrorCode(psr)));
+ }
+ }
+
+ XML_ParserFree(psr);
+}
+
+#endif
+
+/* Fix waypoints in route marks from the standalone marks */
+void
+ce_fix_waypoints(void)
+{
+ ce_route *route = routes;
+ while (route != NULL) {
+ ce_mark *mark = route->marks;
+ while (mark != NULL) {
+ ce_mark *mark2 = marks;
+ while (mark2 != NULL) {
+ if (0 == strcmp(mark->id, mark2->id)) {
+ mark->wp = mark2->wp;
+ mark2->used = 1;
+ break;
+ }
+ mark2 = mark2->next;
+ }
+ mark = mark->next;
+ }
+ route = route->next;
+ }
+}
+
+/* Check route name and if NULL assign a name */
+void
+ce_check_route_names(void)
+{
+ ce_route *route = routes;
+ while (route != NULL) {
+ if (route->r->rte_name == NULL) {
+ cdatastr = '\0';
+ strcat(cdatastr, marks->wp->shortname);
+ strcat(cdatastr, "->");
+ ce_mark *mark = route->marks;
+ while (mark->next != NULL)
+ mark = mark->next;
+ strcat(cdatastr, mark->wp->shortname);
+ route->r->rte_name = xstrdup(cdatastr);
+ }
+ route = route->next;
+ }
+}
+
+/* Remove marks used in routes */
+void
+ce_remove_unused_marks(void)
+{
+ ce_mark *mark = marks;
+ ce_mark *prev_mark = NULL;
+ while (mark != NULL) {
+ if (mark->used == 1) {
+ if (prev_mark == NULL)
+ marks = mark = mark->next;
+ else
+ prev_mark->next = mark = mark->next;
+ continue;
+ }
+ prev_mark = mark;
+ mark = mark->next;
+ }
+}
+
+/* Print out results */
+void
+ce_print_results(void)
+{
+ ce_route *curr_route = routes;
+ while (curr_route != NULL) {
+ printf("Route name=%s id=%s\n", curr_route->r->rte_name, curr_route->id);
+ ce_mark *curr_mark = curr_route->marks;
+ while (curr_mark != NULL) {
+ if (curr_mark->wp == NULL)
+ printf(" null\n");
+ else
+ printf(" %s (%f, %f)\n", curr_mark->wp->shortname, curr_mark->wp->latitude, curr_mark->wp->longitude);
+ curr_mark = curr_mark->next;
+ }
+ curr_route = curr_route->next;
+ }
+ ce_mark *curr_mark = marks;
+ while (curr_mark != NULL) {
+ printf("Mark name=%s id=%s ", curr_mark->wp->shortname, curr_mark->id);
+ if (curr_mark->wp == NULL)
+ printf("(null)\n");
+ else
+ printf("(%f, %f)\n", curr_mark->wp->latitude, curr_mark->wp->longitude);
+ curr_mark = curr_mark->next;
+ }
+}
+
+/* Finish reading the input file */
+void
+ce_rd_deinit(void)
+{
+ ce_fix_waypoints();
+ ce_check_route_names();
+ ce_remove_unused_marks();
+ // ce_print_results();
+
+ // Add routes to GPSBabel
+ ce_route *route = routes;
+ while (route != NULL) {
+ route_add_head(route->r);
+ ce_mark *mark = route->marks;
+ while (mark->next != NULL) {
+ route_add_wpt(route->r, mark->wp);
+ mark = mark->next;
+ }
+ route = route->next;
+ }
+
+ // Add (unused) marks to GPSBabel
+ ce_mark *mark = marks;
+ while (mark != NULL) {
+ waypt_add(mark->wp);
+ mark = mark->next;
+ }
+
+ fclose(fd);
+}
+
+void
+ce_wr_init(const char *fname)
+{
+ fatal(MYNAME ": Does not support writing CoastalExplorer files.\n");
+ ofd = xfopen(fname, "w", MYNAME);
+}
+
+void
+ce_wr_deinit(void)
+{
+ fclose(ofd);
+}
+
+void
+ce_write(void)
+{
+}
+
+ff_vecs_t coastexp_vecs = {
+ ff_type_file,
+ ce_rd_init,
+ ce_wr_init,
+ ce_rd_deinit,
+ ce_wr_deinit,
+ ce_read,
+ ce_write,
+ NULL,
+ NULL,
+};
--- /dev/null
+<?xml version="1.0"?>\r
+<NavObjectCollection created="20041105T170900Z">\r
+ <Name>Navigation Objects</Name>\r
+ <Visible>true</Visible>\r
+ <ViewSettings created="20041105T171914Z">\r
+ <Position>34.867273 N 120.589158 W</Position>\r
+ <Scale>98208.414698</Scale>\r
+ <Quilting>true</Quilting>\r
+ <ShowVectorCharts>true</ShowVectorCharts>\r
+ </ViewSettings>\r
+ <Route created="20041105T170906Z" id="{58384b15-2ed7-4cee-a827-368917b2c743}">\r
+ <Marks>\r
+ {76e5356a-d5fc-4437-8649-026416c2b185}\r
+ {d5dbd16f-eeba-4f61-b38f-582b584e5db3}\r
+ {9816402a-51a6-4fd5-8c08-b680d23d7911}\r
+ {427ed2ff-bdbb-4d77-b859-1f1eff10c961}\r
+ {0ead9569-64f0-4fb8-9545-4fa3191bbab0}\r
+ {fbe5b26d-b111-4208-ac70-f22b169d9c3e}\r
+ {68cfe23d-2ebf-4075-9726-f743659c7df5}\r
+ {50740d73-e743-4197-a6a0-29ad3114107a}\r
+ {26ae0ba0-a73e-4600-b51a-546d7099c809}\r
+ {b7266cd5-817b-4674-862e-490230a2f925}\r
+ </Marks>\r
+ <RouteLeg created="20041105T170909Z" id="{0699ae10-6257-4d1d-b6e7-37fe694dac26}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170910Z" id="{03dd3451-7040-4e6f-aeb7-6ed6b87612b8}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170913Z" id="{87a407a6-11a5-4b5e-a55e-8484e47da0ee}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170916Z" id="{421115ff-a94a-48f4-acd1-36cf3387e79b}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170920Z" id="{2c587ebf-4e0c-43ad-ae89-4da44819b093}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170926Z" id="{a653ca32-e125-4377-8b86-b254f414ca86}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170927Z" id="{4d32d150-2a89-46d6-993f-1fe54a8f62dc}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T211624Z" id="{3bf50ccf-2d8a-46dc-9574-3fe7ca55f8fc}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170929Z" id="{eb96f93d-6367-4ccf-9850-d84bb5227022}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <RouteLeg created="20041105T170930Z" id="{74f699b8-8b59-4d9a-9656-11877a0a0dcc}">\r
+ <PlannedSpeed>5.0 kn</PlannedSpeed>\r
+ </RouteLeg>\r
+ <DisplayLegRangeBearing>true</DisplayLegRangeBearing>\r
+ <TotalLength>39.06 NM</TotalLength>\r
+ <StartTime>20050516T070000</StartTime>\r
+ <StartAt>first-waypoint</StartAt>\r
+ <Name>Into The Bay</Name>\r
+ </Route>\r
+ <Mark created="20041105T170909Z" id="{76e5356a-d5fc-4437-8649-026416c2b185}">\r
+ <Position>37.763290 N 122.282580 W</Position>\r
+ <Icon>Home</Icon>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-51,-21</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SFBALBAY</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170910Z" id="{d5dbd16f-eeba-4f61-b38f-582b584e5db3}">\r
+ <Position>37.751613 N 122.339028 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-58,4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SFBAY001</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170913Z" id="{9816402a-51a6-4fd5-8c08-b680d23d7911}">\r
+ <Position>37.817420 N 122.394305 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-9,-19</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SFBAY002</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170916Z" id="{427ed2ff-bdbb-4d77-b859-1f1eff10c961}">\r
+ <Position>37.819339 N 122.478302 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-53,-21</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SFGGBRDG</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170920Z" id="{0ead9569-64f0-4fb8-9545-4fa3191bbab0}">\r
+ <Position>37.773033 N 122.605838 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-92,-13</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SFCHNL01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170926Z" id="{fbe5b26d-b111-4208-ac70-f22b169d9c3e}">\r
+ <Position>37.518860 N 122.529914 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-98,-4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>HMCOLREF</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170927Z" id="{68cfe23d-2ebf-4075-9726-f743659c7df5}">\r
+ <Position>37.482348 N 122.507704 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-77,1</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>HMPILL01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170929Z" id="{26ae0ba0-a73e-4600-b51a-546d7099c809}">\r
+ <Position>37.476448 N 122.475800 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>13,-1</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>HMPILL02</Name>\r
+ </Mark>\r
+ <Mark created="20041105T170930Z" id="{b7266cd5-817b-4674-862e-490230a2f925}">\r
+ <Position>37.495102 N 122.483927 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-91,-4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>HMPILL03</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211300Z" id="{5bf0873d-5c50-4ad4-8c36-e8d90b068908}">\r
+ <Position>37.229349 N 122.441589 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-95,-4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PESCDR01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211324Z" id="{625fb518-f83b-4e24-add2-852544d6fc52}">\r
+ <Position>37.183397 N 122.411904 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-90,-2</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PIGEON01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211341Z" id="{1677d889-5a9e-463e-b398-03da7165d31d}">\r
+ <Position>37.090736 N 122.348775 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-89,0</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>ANONUV01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211409Z" id="{aac62a78-9a10-4c98-b057-3bd05cb667c2}">\r
+ <Position>36.929502 N 122.113725 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-51,4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SCRUZ01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211416Z" id="{2972124d-66f4-48a7-932d-2100eb3f5f6d}">\r
+ <Position>36.934235 N 122.022130 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>22,-8</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SCRUZ02</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211420Z" id="{aabdee59-c849-4eaf-8005-b1e814650244}">\r
+ <Position>36.960666 N 122.024734 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>22,-9</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SCRUZENT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T211624Z" id="{50740d73-e743-4197-a6a0-29ad3114107a}">\r
+ <Position>37.475062 N 122.488531 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-44,5</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>HMPILLPT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212422Z" id="{83540001-9f5d-4cb5-8218-51bfaeb7b3e8}">\r
+ <Position>36.581344 N 121.995411 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-95,-7</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>CYPRSSPT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212438Z" id="{311a8303-dc05-497d-aaa6-d4cba53e3464}">\r
+ <Position>36.301110 N 121.919097 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-67,-3</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTSUR</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212515Z" id="{2a7de189-ea1b-46d5-a168-d9ada708f50b}">\r
+ <Position>36.238177 N 121.855209 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-72,3</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>COOPERPT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212526Z" id="{3d6f3fe8-bc77-4d0b-9b4d-7fe1e41c5691}">\r
+ <Position>36.225175 N 121.801314 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-91,-8</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PFEIFENT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212531Z" id="{12481c1c-7f84-48d7-a7ad-ac613a036cea}">\r
+ <Position>36.230449 N 121.797444 W</Position>\r
+ <Icon>Anchor</Icon>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-85,-14</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PFEIFANC</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212826Z" id="{d04c1156-4ca6-4b79-8177-929796c0c330}">\r
+ <Position>35.879801 N 121.498947 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>10,-15</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SANMRT01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212833Z" id="{724553f0-6d4a-48c7-9813-c61d1b9e64f3}">\r
+ <Position>35.652801 N 121.308485 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-75,2</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PDRSBLNC</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212850Z" id="{3f52e80e-0c8d-4e8f-ba57-0b99ff5a1b41}">\r
+ <Position>35.623297 N 121.185920 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-102,-6</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SNSMNENT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T212853Z" id="{409cc119-ed3f-4d02-8ccc-c738dcbdd96b}">\r
+ <Position>35.640478 N 121.183772 W</Position>\r
+ <Icon>Anchor</Icon>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-105,-9</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SNSMNANC</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213618Z" id="{6d0a144a-6ce0-466c-9af4-478bc375580c}">\r
+ <Position>35.572353 N 121.152797 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-80,-1</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>CAMBRIA</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213626Z" id="{3d9062c5-e059-457d-859c-549dea0c101f}">\r
+ <Position>35.449214 N 121.020825 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>14,-14</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTESTERO</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213635Z" id="{8f66e2de-fa62-43d5-af69-44724867429b}">\r
+ <Position>35.216602 N 120.928391 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-96,-3</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTBUCHON</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213642Z" id="{15b56103-0d91-446a-9e0f-0d5817581f9b}">\r
+ <Position>34.883361 N 120.684631 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-57,3</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTSAL01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213647Z" id="{361b3cd3-1e77-4867-b956-d01b152ed22d}">\r
+ <Position>34.884641 N 120.652026 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-96,-8</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTSALENT</Name>\r
+ <Description>A description of the Point Sal Entrance mark</Description>\r
+ </Mark>\r
+ <Mark created="20041105T213704Z" id="{4d6b54b8-b3e5-42f0-ab33-f90b60752bcd}">\r
+ <Position>34.896555 N 120.649124 W</Position>\r
+ <Icon>Anchor</Icon>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-96,-10</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTSALANC</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213949Z" id="{d5bfc894-670e-47c7-9a0f-74e406fdf3ca}">\r
+ <Position>34.758180 N 120.642516 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>22,-8</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PURSMAPT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T213954Z" id="{682a9c6d-a632-4e8b-acd8-42d156a2fe3e}">\r
+ <Position>34.572579 N 120.663636 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-97,-7</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>PTARGLLO</Name>\r
+ </Mark>\r
+ <Mark created="20041105T214005Z" id="{8787e521-19cb-400a-9efc-1b8863b70132}">\r
+ <Position>34.113844 N 120.492630 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>20,-11</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SANMGL01</Name>\r
+ </Mark>\r
+ <Mark created="20041105T214044Z" id="{33aa93e4-da08-42c6-a42c-49cf71eff499}">\r
+ <Position>34.029483 N 120.471409 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-88,0</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SANMGL02</Name>\r
+ </Mark>\r
+ <Mark created="20041105T214048Z" id="{61fe867b-1b99-49b1-8188-adda5069cccf}">\r
+ <Position>34.019184 N 120.444197 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-32,5</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>SANMGL03</Name>\r
+ </Mark>\r
+ <Mark created="20041105T214057Z" id="{b3dc7ee2-ffe1-458d-be60-b3a92f089ae4}">\r
+ <Position>34.023478 N 120.438209 W</Position>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>19,-4</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>ADCOVENT</Name>\r
+ </Mark>\r
+ <Mark created="20041105T214059Z" id="{d2e24f39-796a-4853-8d3a-32106be5e2b7}">\r
+ <Position>34.028615 N 120.439696 W</Position>\r
+ <Icon>Anchor</Icon>\r
+ <ArrivalCircleRadius>0.05 NM</ArrivalCircleRadius>\r
+ <RangeCircleRadius>0 NM</RangeCircleRadius>\r
+ <NameOffset>-102,-5</NameOffset>\r
+ <DescriptionOffset>0,24</DescriptionOffset>\r
+ <Name>ADCOVANC</Name>\r
+ </Mark>\r
+</NavObjectCollection>\r